﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;

namespace AcessaDadosBD.Repositorios
{
    public class OperadoraPrestadorRepository : IRepository<OperadoraPrestador>
    {
        private IDbCommand Command { get; set; }

        public OperadoraPrestadorRepository(IDbCommand cmd)
        {
            this.Command = cmd;
        }

        public OperadoraPrestador GetById(int id)
        {
            try
            {
                Command.Connection.Open();

                Command.CommandText = "SELECT idOperadoraPrestador, idPrestador, registroANS, codigoNaOperadora FROM tbOperadoraPrestador WHERE idOperadoraPrestador=" + id;
                Command.CommandType = CommandType.Text;

                var reader = Command.ExecuteReader();

                if (reader.Read())
                {
                    OperadoraPrestador operadoraPrestador = new OperadoraPrestador()
                    {
                        ID = int.Parse(reader["idOperadoraPrestador"].ToString()),
                        IDPrestador = int.Parse(reader["idPrestador"].ToString()),
                        RegistroANS = reader["registroANS"].ToString(),
                        CodigoNaOperadora = reader["codigoNaOperadora"].ToString()
                    };
                    return operadoraPrestador;
                }
                else
                {
                    return null;
                    //throw new Exception("OperadoraPrestador não encontrado");
                }
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao executar operação: " + e.Message);
            }
            finally
            {
                Command.Connection.Close();
            }
        }

        public IQueryable<OperadoraPrestador> GetAll()
        {
            try
            {
                Command.Connection.Open();

                Command.CommandText = "SELECT idOperadoraPrestador, idPrestador, registroANS, codigoNaOperadora FROM tbOperadoraPrestador";
                Command.CommandType = CommandType.Text;

                var reader = Command.ExecuteReader();

                List<OperadoraPrestador> list = new List<OperadoraPrestador>();
                while (reader.Read())
                {
                    OperadoraPrestador operadoraPrestador = new OperadoraPrestador()
                    {
                        ID = int.Parse(reader["idOperadoraPrestador"].ToString()),
                        IDPrestador = int.Parse(reader["idPrestador"].ToString()),
                        RegistroANS = reader["registroANS"].ToString(),
                        CodigoNaOperadora = reader["codigoNaOperadora"].ToString()
                    };
                    list.Add(operadoraPrestador);
                }
                return list.AsQueryable<OperadoraPrestador>();
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao executar operação: " + e.Message);
            }
            finally
            {
                Command.Connection.Close();
            }
        }

        public int Insert(OperadoraPrestador entity)
        {
            try
            {
                Command.Connection.Open();

                Command.CommandText = "INSERT INTO tbOperadoraPrestador (idPrestador, registroANS, codigoNaOperadora) VALUES (" +
                    entity.IDPrestador + ",'" + entity.RegistroANS + "', '" + entity.CodigoNaOperadora + "')";
                Command.CommandType = CommandType.Text;

                Command.ExecuteNonQuery();

                Command.CommandText = "SELECT @@IDENTITY";

                return int.Parse(Command.ExecuteScalar().ToString());
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao executar operação: " + e.Message);
            }
            finally
            {
                Command.Connection.Close();
            }
        }

        public void Delete(OperadoraPrestador entity)
        {
            try
            {
                Command.Connection.Open();

                Command.CommandText = "DELETE FROM tbOperadoraPrestador WHERE idOperadoraPrestador=" + entity.ID;
                Command.CommandType = CommandType.Text;

                Command.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao executar operação: " + e.Message);
            }
            finally
            {
                Command.Connection.Close();
            }
        }

        public void Update(OperadoraPrestador entity)
        {
            try
            {
                Command.Connection.Open();

                Command.CommandText = "UPDATE tbOperadoraPrestador SET idPrestador=" + entity.IDPrestador + ", registroANS='" + entity.RegistroANS +
                    "', codigoNaOperadora='" + entity.CodigoNaOperadora + "' WHERE idOperadoraPrestador=" + entity.ID;
                Command.CommandType = CommandType.Text;

                Command.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao executar operação: " + e.Message);
            }
            finally
            {
                Command.Connection.Close();
            }
        }
    }
}
